সি প্রোগ্রামিং ভাষায় Exception Handling বা অসতর্ক অবস্থা হ্যান্ডলিং সরাসরি কোন বিল্ট-ইন ফিচারের মাধ্যমে সরবরাহ করা হয় না, যেমন অন্যান্য ভাষায় (যেমন C++, Java)। তবে, সি প্রোগ্রামিংয়ে এক্সসেপশন হ্যান্ডলিং হ্যান্ডল করার জন্য কিছু কৌশল এবং ট্রিক্স ব্যবহার করা হয়, যা ভুল বা অসতর্ক অবস্থা (runtime error) এ প্রতিক্রিয়া জানাতে সাহায্য করে।
সি ভাষায় সাধারণত error handling করা হয় বিভিন্ন return values, error codes, assertions, এবং setjmp()/longjmp() ফাংশন ব্যবহারের মাধ্যমে।
সি ভাষায় ফাংশনগুলো সাধারণত ইনপুট/আউটপুট, মেমোরি অ্যাক্সেস, ফাইল ওপেন ইত্যাদি অপারেশন সম্পাদনের সময় error codes রিটার্ন করে, যা থেকে প্রোগ্রামার বুঝতে পারেন যে কোনো সমস্যা ঘটেছে।
#include <stdio.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
// চেক করা যে ফাইল ওপেন সফল হয়েছে কিনা
if (file == NULL) {
printf("Error opening file. Exiting program...\n");
return 1; // Error code রিটার্ন
}
// ফাইল কাজ সম্পন্ন করার পর বন্ধ করা
fclose(file);
return 0;
}
এখানে, fopen()
যদি ফাইল ওপেন করতে ব্যর্থ হয় তবে এটি NULL
রিটার্ন করবে, এবং প্রোগ্রাম একটি error message প্রদর্শন করবে এবং বের হয়ে যাবে।
assert()
ব্যবহার করে Error Checkingassert()
একটি ম্যাক্রো যা একটি শর্ত যাচাই করে এবং সেই শর্তটি যদি সত্য না হয় তবে প্রোগ্রামটি ক্র্যাশ হয়ে যায়। এটি সাধারণত ডিবাগিং এর সময় ব্যবহার করা হয়, কিন্তু runtime error হ্যান্ডলিংয়ের জন্য এটি কিছুটা সহায়ক হতে পারে।
#include <stdio.h>
#include <assert.h>
int divide(int a, int b) {
assert(b != 0); // নিশ্চিত করা যে, b শূন্য নয়
return a / b;
}
int main() {
int result = divide(10, 0); // ভুল ইনপুট দেওয়া হয়েছে
printf("Result: %d\n", result);
return 0;
}
এখানে, assert(b != 0)
নিশ্চিত করবে যে b
শূন্য নয়। যদি b == 0
হয়, তবে প্রোগ্রামটি চলাকালীন একটি ত্রুটি দেখাবে এবং প্রোগ্রামটি বন্ধ হবে।
setjmp()
এবং longjmp()
ব্যবহার করে Error Handlingসি ভাষায় setjmp()
এবং longjmp()
ফাংশন দুটি ব্যবহার করে আপনি একটি ফাংশনের মধ্যে exception handling করতে পারেন। setjmp()
ফাংশন একটি পয়েন্ট (checkpoint) সেট করে, এবং longjmp()
ফাংশনটি সেই পয়েন্টে চলে আসে, এটি কার্যকরভাবে exception-handling এর মতো কাজ করে।
#include <setjmp.h>
jmp_buf env; // Declare a buffer to store the environment
int main() {
int val = setjmp(env); // setjmp sets the environment and returns 0 initially
if (val != 0) {
// If we come here after calling longjmp, then it's an error condition
printf("Error occurred: %d\n", val);
return 1;
} else {
// Normal program flow
// Simulating an error
longjmp(env, 1); // Simulate an error by jumping back to setjmp
}
return 0;
}
ব্যাখ্যা:
setjmp(env)
: এটি চেকপয়েন্ট তৈরি করে এবং 0
রিটার্ন করে।longjmp(env, 1)
: এটি setjmp()
-এ ফিরে যায় এবং 1
রিটার্ন করে, যা একটি ত্রুটি (exception) হিসাবে চিহ্নিত হয়।এটি সি প্রোগ্রামে exception handling এ একটি কাজের মেকানিজম হতে পারে, তবে এটি কিছুটা ঝুঁকিপূর্ণ এবং সঠিকভাবে ব্যবহৃত না হলে প্রোগ্রামের স্টেট ম্যানেজমেন্টে সমস্যা তৈরি করতে পারে।
errno
errno
একটি গ্লোবাল ভেরিয়েবল যা সিস্টেম কল বা লাইব্রেরি ফাংশনগুলির সাথে সম্পর্কিত ত্রুটির কোড ধারণ করে। যখন কোনো সিস্টেম কল বা লাইব্রেরি ফাংশন ত্রুটি ঘটায়, তখন তা errno
সেট করে, এবং প্রোগ্রামার সেই ত্রুটির ধরন চিহ্নিত করতে perror()
বা strerror()
ফাংশন ব্যবহার করতে পারেন।
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
// `errno` এবং `perror()` এর মাধ্যমে ত্রুটি প্রদর্শন
perror("Error opening file");
printf("Error number: %d\n", errno);
return 1;
}
fclose(file);
return 0;
}
এখানে perror()
ফাংশনটি errno
ভেরিয়েবলের মানের মাধ্যমে একটি ত্রুটি বার্তা প্রদর্শন করে।
পদ্ধতি | বর্ণনা |
---|---|
return values | ফাংশনের মাধ্যমে error code রিটার্ন করে ত্রুটি শনাক্ত করা। |
assert() | নির্দিষ্ট শর্ত যাচাই করার জন্য ব্যবহৃত, ডিবাগিং এর সময়। |
setjmp()/longjmp() | এক্সেপশন হ্যান্ডলিংয়ের জন্য ব্যবহার করা হয়। |
errno | সিস্টেম কল বা লাইব্রেরি ফাংশন দ্বারা রিটার্ন করা ত্রুটি কোড। |
সি প্রোগ্রামিং ভাষায় Exception Handling সরাসরি সমর্থিত না হলেও, return values
, setjmp()/longjmp()
, errno
এবং assert()
এর মাধ্যমে ত্রুটি শনাক্তকরণ এবং হ্যান্ডলিং করা সম্ভব।
common.read_more